

<!DOCTYPE html>
<html>
<head>
    <title>Pilgrim</title>

    <!-- meta -->
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <!-- css -->
    <link rel="stylesheet" href="http://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css">
    <link rel="stylesheet" href="/static/blog/css/bootstrap.min.css">
    <link rel="stylesheet" href="/static/blog/css/pace.css">
    <link rel="stylesheet" href="/static/blog/css/custom.css">
    <link rel="stylesheet" href="/static/blog/css/highlights/github.css">

    <style>
        span.highlighted {
            color: yellow;
        }
    </style>

    <!-- js -->
    <script src="/static/blog/js/jquery-2.1.3.min.js"></script>
    <script src="/static/blog/js/bootstrap.min.js"></script>
    <script src="/static/blog/js/pace.min.js"></script>
    <script src="/static/blog/js/modernizr.custom.js"></script>
</head>

<body>
<div class="container">
    <header id="site-header">
        <div class="row">
            <div class="col-md-4 col-sm-5 col-xs-8">
                <div class="logo">
                    <h1><a href="/"><b>Pilgrim</b></a></h1>
                </div>
            </div><!-- col-md-4 -->
            <div class="col-md-8 col-sm-7 col-xs-4">
                <nav class="main-nav" role="navigation">
                    <div class="navbar-header">
                        <button type="button" id="trigger-overlay" class="navbar-toggle">
                            <span class="ion-navicon"></span>
                        </button>
                    </div>

                    <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
                        <ul class="nav navbar-nav navbar-right">
                            <li class="cl-effect-11"><a href="/" data-hover="首页">首页</a></li>
                            <li class="cl-effect-11"><a href="#" data-hover="博客">博客</a></li>
                            <li class="cl-effect-11"><a href="#" data-hover="关于">关于</a></li>
                            <li class="cl-effect-11"><a href="#" data-hover="联系">联系</a></li>
                        </ul>
                    </div><!-- /.navbar-collapse -->
                </nav>
                <div id="header-search-box">
                    <a id="search-menu" href="#"><span id="search-icon" class="ion-ios-search-strong"></span></a>
                    <div id="search-form" class="search-form">
                        <form role="search" method="get" id="searchform" action="/search/">
                            <input type="search" name="q" placeholder="搜索" required>
                            <button type="submit"><span class="ion-ios-search-strong"></span></button>
                        </form>
                    </div>
                </div>
            </div><!-- col-md-8 -->
        </div>
    </header>
</div>
<div class="copyrights">Collect from <a href="#">blog</a></div>
<div class="copyrights">Modified by <a href="#">博客</a></div>

<div class="content-body">
    <div class="container">
        <div class="row">
            <main class="col-md-8">
                
    <article class="post post-11">
        <header class="entry-header">
            <h1 class="entry-title">多任务</h1>
            <div class="entry-meta">
                <span class="post-category">
                    <a href="/category/5/">多任务</a></span>
                <span class="post-date"><a href="#"><time class="entry-date"
                                                          datetime="2019年8月22日 17:01">2019年8月22日 17:01</time></a></span>
                <span class="post-author"><a href="#">chenjj</a></span>
                <span class="comments-link">
                    <a href="/post/11/#comment-area">0 评论</a></span>
                <span class="views-count"><a href="#">10 阅读</a></span>
            </div>
        </header>
        <div class="entry-content clearfix">
            <p>一、多任务编程
1.  概念</p>
<div class="codehilite"><pre><span></span>     多任务就是指在同一时间执行多个任务。
     并发：本质上是在同一段时间内交替的执行多任务，也就是说在同一时刻只有一个任务在执行。由 
     于切换的速度特别快，所以感觉上好像的多个任务同时执行。
      并行：操作系统会给CPU的每个内核安排一个执行的软件，算是真正的多任务同时执行。
      同步：执行顺序是线性的，自上而下，一个
      异步：多个任务互不干扰，同时执行。
      线程：线程是最下的CPU调度单位，依附在进程中，一个运行的程序中默认有一个主进程，进程中 
      默认有一个主线程
      进程：一个正在运行的程序或软件就是一个进程，是操作系统进行资源分配的最小单位
      协程：协程也叫微线程，是在同一个线程内不断的切换多个任务函数来实现的多任务方式
      互斥锁：对共享数据进行锁定，保证同一时刻只能有一个线程执行的解决资源竞争问题的方法
      死锁：锁没有被正常释放，让其他线程一直处于等待状态的逻辑错误，会导致程序无法向下执行
      使用方法：
</pre></div>


<p>进程：</p>
<div class="codehilite"><pre><span></span>     导包：multiprocessing
     设置进程：p1=multiprocessing.Process(target=func1, name=&#39;func1&#39;)
     执行进程：p1.start（）
</pre></div>


<p>线程：</p>
<div class="codehilite"><pre><span></span>     <span class="err">导包：</span><span class="kn">import</span> <span class="nn">threading</span>
     <span class="err">设置线程</span> <span class="n">p1</span><span class="o">=</span> <span class="n">threading</span><span class="o">.</span><span class="n">Thread</span><span class="p">(</span><span class="n">target</span><span class="o">=</span><span class="err">任务名</span><span class="p">)</span>
     <span class="err">启动线程</span><span class="n">p1</span><span class="o">.</span><span class="n">start</span><span class="err">（）</span>
</pre></div>


<p>协程：</p>
<div class="codehilite"><pre><span></span>     导包：pip3 install gevent
     g1 = gevent.spawn(函数)
     g1.start()
</pre></div>


<p>互斥锁：</p>
<div class="codehilite"><pre><span></span>     对共享数据进行锁定，保证同一时刻只能有一个线程去操作（如公共卫生间，一个人进入后反锁， 
     其他人无法使用）
</pre></div>


<p>。
使用过程：</p>
<div class="codehilite"><pre><span></span>     创建全局锁：lock = threading.Lock()
    上锁： lock.acquire()
     解锁：  lock.release()
     死锁：
一直等对方释放锁的情景就是死锁，（例如：单行道两辆车顶头，互相等对方后退，其结果是谁也 
    走不成，这就死锁）。
</pre></div>


<p>应用范围</p>
<div class="codehilite"><pre><span></span>   ①Nginx主流的工作模式就是多进程模式
   ②Chrome浏览器也是多进程方式，一个网页崩溃不会影响到其他网页
   ③Redis平时工作是单个进程，涉及到耗时操作也会用到多进程
   ④桌面软件响应用户输入的是一个线程，后台程序处理是另外的线程
   ⑤memcached也是多线程模式
</pre></div>


<p>进程和线程之间的区别：</p>
<div class="codehilite"><pre><span></span>   ①    线程依附于进程，没有进程就没有线程。
   ②    一个进程默认有一个线程，可以拥有多个线程。
   ③    进程之间不共享全局变量，线程之间共享全局变量，但是要注意资源竞争的问题，解决办法: 互斥锁或者线程同步。
  ④ 创建进程的资源开销更大。
  ⑤ 进程是系统资源分配在基本单位，线程是CPU调度的基本单位。
  ⑥ 线程不能独立执行，必须依存于进程中。
  ⑦ 多进程比单进程稳定性更强。
</pre></div>


<p>进程和线程的优缺点对比：</p>
<div class="codehilite"><pre><span></span>     进程优缺点：优点：可以用多核   缺点：资源开销大
     线程优缺点：优点：资源开销小  缺点：不能使用多核
</pre></div>


<p>协程的优点：</p>
<div class="codehilite"><pre><span></span>    进程和线程都面临着内核态和用户态的切换问题而耗费许多切换时间，而协程就是用户自己控制切 
    换的时机，不再需要陷入系统的内核态。
   不需要多线程的锁机制，由于只有一个线程，故也就不存在同时写变量的冲突，在协程中控制共享 
   资源不需要加锁，只需要判断数据的状态，所以执行效率远高于线程。
   进程间的通信方式：
管道、消息队列、信号量、共享内存、套接字
</pre></div>


<p>管道：</p>
<div class="codehilite"><pre><span></span>无名管道：管道是一种半双工的通信方式，数据只能单向流动，而且只能在具有亲缘关系的进程间 
    使用。进程的亲缘关系通常是指父子进程关系。
高级管道：将另一个程序当做一个新的进程在当前程序进程中启动，则它算是当前程序的子进程， 
    这种方式我们成为高级管道方式。
有名管道：有名管道也是半双工的通信方式，但是它允许无亲缘关系进程间的通信。
    消息队列：
消息队列是由消息的链表，存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息 
    少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
</pre></div>


<p>信号量：</p>
<div class="codehilite"><pre><span></span>     信号量是一个计数器，可以用来控制多个进程对共享资源的访问。它常作为一种锁机制，防止某进 
     程正在访问共享资源时，其他进程也访问该资源。因此，主要作为进程间以及同一进程内不同线程 
     之间的同步手段。
</pre></div>


<p>共享内存：</p>
<div class="codehilite"><pre><span></span>共享内存就是映射一段能被其他进程所访问的内存，这段共享内存由一个进程创建，但多个进程都 
    可以访问。共享内存是最快的 IPC 方式，它是针对其他进程间通信方式运行效率低而专门设计的。 
    它往往与其他通信机制，如信号两，配合使用，来实现进程间的同步和通信。
</pre></div>


<p>套接字：</p>
<div class="codehilite"><pre><span></span>套解口也是一种进程间通信机制，与其他通信机制不同的是，它可用于不同机器间的进程通信。
</pre></div>


<p>线程间的通信方式：</p>
<div class="codehilite"><pre><span></span>     消息队列、使用全局变量、使用事件CEvent类实现线程间的通信
</pre></div>


<p>消息队列：</p>
<div class="codehilite"><pre><span></span>是最常用的一种，也是最灵活的一种，通过自定义数据结构，可以传输复杂和简单的数据结构。在 
    Windows程序设计中，每一个线程都可以拥有自己的消息队列，因此可以采用消息进行线程间通 
    信。
</pre></div>


<p>6.拓展</p>
<div class="codehilite"><pre><span></span>    ①进程间的通信方式：
        管道：pipe 半双工通信模式，数据单项流动于父子进程之间
        有名管道：namepipe 半双工通信模式，允许所有进程间通信
        信号量：semophore 计数器用来控制多个进程对共享资源的访问
        共享内存：share memory 映射一段能被其他进程访问的内存，多与信号量配合使用来实现进程 
        间的同步和通信
        套接字：socket 套接字是一种进程间的通信机制，可以用于不同设备及其间的进程通信
     ②线程间的通信方式：
         锁机制：互斥锁、读写锁 读写锁允许多个线程同时读取数据，但对写操作互斥
         线程间的通信目的主要用于线程同步，所以线程之间没有像进程通信中的用于数据交换的通信机 
         制
      ③memcached是一套分布式高速缓存系统，使用多线程模型，一个master线程多个worker线程， 
          master和worker通过管道实现通信
</pre></div>


<p>进程池实现</p>
<div class="codehilite"><pre><span></span>            必要性
            进程的创建和销毁过程消耗的资源较多
            当任务量众多,每个任务在很短时间内完成时,需要频繁的创建和销毁进程.此时对计算机压力较 
            大
            进程池技术很好的解决了以上问题
</pre></div>


<p>原理</p>
<div class="codehilite"><pre><span></span>   <span class="err">创建一定数量的进程来处理事件</span><span class="p">,</span><span class="err">事件处理完进程不退出而是继续处理其他时间</span><span class="p">,</span><span class="err">直到所有事件全</span> 
   <span class="err">都处理完毕统一销毁</span><span class="o">.</span><span class="err">增加进程的重复利用</span><span class="p">,</span><span class="err">降低资源消耗</span><span class="o">.</span>
    <span class="err">进程池实现</span>
         <span class="mf">1.</span><span class="err">创建进程池对象</span><span class="p">,</span><span class="err">放入适当的进程</span>
            <span class="kn">from</span> <span class="nn">multiprocessing</span> <span class="kn">import</span> <span class="n">Pool</span>
            <span class="n">Pool</span><span class="p">(</span><span class="n">processes</span><span class="p">)</span>
            <span class="err">功能：</span> <span class="err">创建进程池对象</span>
            <span class="err">参数：</span> <span class="err">指定进程数量，默认根据系统自动判定</span>
         <span class="mf">2.</span><span class="err">将事件加入进程池队列执行</span>
             <span class="n">pool</span><span class="o">.</span><span class="n">apply_async</span><span class="p">(</span><span class="n">func</span><span class="p">,</span><span class="n">args</span><span class="p">,</span><span class="n">kwds</span><span class="p">)</span>
             <span class="err">功能</span><span class="p">:</span> <span class="err">使用进程池执行</span> <span class="n">func事件</span>
             <span class="err">参数：</span> <span class="n">func</span> <span class="err">事件函数</span>
             <span class="n">args</span> <span class="err">元组</span>  <span class="err">给</span><span class="n">func按位置传参</span>
             <span class="n">kwds</span> <span class="err">字典</span>  <span class="err">给</span><span class="n">func按照键值传参</span>
             <span class="err">返回值：</span> <span class="err">返回函数事件对象</span>
         <span class="mf">3.</span><span class="err">关闭进程池</span>
             <span class="n">pool</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
             <span class="err">功能：</span> <span class="err">关闭进程池</span>
</pre></div>


<p>4. 回收进程池中进程
                  pool.join()
                  功能： 回收进程池中进程</p>
            <div class="widget-tag-cloud">
                <ul>
                    标签：
                    
                </ul>
            </div>
        </div>
    </article>
    <section class="comment-area" id="comment-area">
        <hr>
        <h3>发表评论</h3>
        <form action="/comment/post/11/" method="post" class="comment-form">
            
            <div class="row">
                <div class="col-md-4">
                    <label for="id_name">名字：</label>
                    <input id="id_name" maxlength="100" name="name" type="text" required />
                    
                </div>
                <div class="col-md-4">
                    <label for="id_email">邮箱：</label>
                    <input id="id_email" maxlength="255" name="email" type="email" required />
                    
                </div>
                <div class="col-md-4">
                    <label for="id_url">URL：</label>
                    <input id="id_url" maxlength="200" name="url" type="url" />
                    
                </div>
                <div class="col-md-12">
                    <label for="id_text">评论：</label>
                    <textarea cols="40" id="id_text" name="text" rows="10" required>
</textarea>
                    
                    <button type="submit" class="comment-btn">发表</button>
                </div>
            </div>    <!-- row -->
        </form>
        <div class="comment-list-panel">
            <h3>评论列表，共 <span>0</span> 条评论</h3>
            <ul class="comment-list list-unstyled">
                
                    暂无评论
                
            </ul>
        </div>
    </section>

            </main>
            <aside class="col-md-4">
                
    <div class="widget widget-content">
        <h3 class="widget-title">文章目录</h3>
        <div class="toc">
<ul></ul>
</div>

    </div>

                <div class="widget widget-recent-posts">
                    <h3 class="widget-title">最新文章</h3>
                    
                    <ul>
                        
                            <li>
                                <a href="/post/23/">数据分析推荐书籍</a>
                            </li>
                        
                            <li>
                                <a href="/post/32/">提高并发的方法</a>
                            </li>
                        
                            <li>
                                <a href="/post/25/">Python数据结构与算法（几种排序）</a>
                            </li>
                        
                            <li>
                                <a href="/post/21/">下山</a>
                            </li>
                        
                            <li>
                                <a href="/post/19/">cjj</a>
                            </li>
                        
                    </ul>
                </div>
                <div class="widget widget-archives">
                    <h3 class="widget-title">归档</h3>
                    
                    <ul>
                        
                            <li>
                                <a href="/archives/2019/12/">2019
                                    年 12 月</a>
                            </li>
                        
                            <li>
                                <a href="/archives/2019/10/">2019
                                    年 10 月</a>
                            </li>
                        
                            <li>
                                <a href="/archives/2019/8/">2019
                                    年 8 月</a>
                            </li>
                        
                    </ul>
                </div>

                <div class="widget widget-category">
                    <h3 class="widget-title">分类</h3>
                    
                    <ul>
                        
                            <li>
                                <a href="/category/1/">陈俊杰 <span
                                        class="post-count">(3)</span></a>
                            </li>
                        
                            <li>
                                <a href="/category/2/">数据库 <span
                                        class="post-count">(6)</span></a>
                            </li>
                        
                            <li>
                                <a href="/category/3/">消息队列 <span
                                        class="post-count">(3)</span></a>
                            </li>
                        
                            <li>
                                <a href="/category/4/">http、tcp/ip <span
                                        class="post-count">(6)</span></a>
                            </li>
                        
                            <li>
                                <a href="/category/5/">多任务 <span
                                        class="post-count">(3)</span></a>
                            </li>
                        
                            <li>
                                <a href="/category/6/">redis <span
                                        class="post-count">(3)</span></a>
                            </li>
                        
                            <li>
                                <a href="/category/7/">git <span
                                        class="post-count">(1)</span></a>
                            </li>
                        
                            <li>
                                <a href="/category/8/">状态保持 <span
                                        class="post-count">(2)</span></a>
                            </li>
                        
                            <li>
                                <a href="/category/10/">Docker <span
                                        class="post-count">(1)</span></a>
                            </li>
                        
                            <li>
                                <a href="/category/11/">搜索引擎 <span
                                        class="post-count">(2)</span></a>
                            </li>
                        
                            <li>
                                <a href="/category/12/">数据分析 <span
                                        class="post-count">(1)</span></a>
                            </li>
                        
                            <li>
                                <a href="/category/13/">数据结构与算法 <span
                                        class="post-count">(1)</span></a>
                            </li>
                        
                            <li>
                                <a href="/category/14/">markdown语法 <span
                                        class="post-count">(1)</span></a>
                            </li>
                        
                            <li>
                                <a href="/category/15/">非阻塞式IO <span
                                        class="post-count">(3)</span></a>
                            </li>
                        
                    </ul>
                </div>

                <div class="widget widget-tag-cloud">
                    <h3 class="widget-title">标签</h3>
                    
                    <ul>
                        
                            暂无标签！
                        
                    </ul>
                </div>

                <div class="rss">
                    <a href="#">才华撑不起野心，经济撑不起梦想</a>
                </div>
            </aside>
        </div>
    </div>
</div>
<footer id="site-footer">
    <div class="container">
        <div class="row">
            <div class="col-md-12">

                </p>
            </div>
        </div>
    </div>
</footer>

<!-- Mobile Menu -->
<div class="overlay overlay-hugeinc">
    <button type="button" class="overlay-close"><span class="ion-ios-close-empty"></span></button>
    <nav>
        <ul>
            <li><a href="/">首页</a></li>
            <li><a href="#">博客</a></li>
            <li><a href="#">关于</a></li>
            <li><a href="#">联系</a></li>
        </ul>
    </nav>
</div>

<script src="/static/blog/js/script.js"></script>

</body>
</html>
